package com.wn.system.controller;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.wn.common.exception.Assert;
import com.wn.common.model.dto.CardAddDto;
import com.wn.common.model.dto.LoginUserDto;
import com.wn.common.model.dto.UserRegisterDto;
import com.wn.common.model.vo.LoginVo;
import com.wn.common.model.vo.UserInfoVo;
import com.wn.common.result.Result;
import com.wn.system.entity.User;
import com.wn.system.entity.UserDetail;
import com.wn.system.service.IUserDetailService;
import com.wn.system.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * @author yellow Docter
 * @date 2023 -07-20
 * @desc
 */
@RestController
@RequestMapping("user")
public class UserController {

    @Autowired
    private IUserService userService;

    @Autowired
    private IUserDetailService userDetailService;

    @GetMapping("/ok")
    private Result hello() {
        Assert.error(null,"我没有钱吃饭、饿肚子");
        return Result.ok();
    }

    @GetMapping("/list")
    private Result list() {
        List<User> list = userService.list();
        return Result.ok(list);
    }

    @PostMapping("/register")
    private Result register(@RequestBody UserRegisterDto userRegisterDto) {
        userService.register(userRegisterDto);
        return Result.ok("注册成功...");
    }


    @PostMapping("/login")
    private Result login(@RequestBody LoginUserDto loginUserDto) {
        //返回登录用户
        LoginVo loginVo = userService.login(loginUserDto);
        return Result.ok(loginVo);
    }

    /**
     * 测试需要token
     * @return
     */
    @PostMapping("/auth/test")
    private Result test1(HttpServletRequest request) {

        //获取用户信息
        String userId = request.getHeader("userId");
        System.out.println("userId = " + userId);

        //如果代码在service 是否可以获取头信息
        // request的容器  (可以获取req对象)
        // req 属性对象
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

        // 通过属性对象 拿到 请求对象
        HttpServletRequest req = requestAttributes.getRequest();
        // 通过请求对象拿到 头信息
        String uid = request.getHeader("userId");
        System.out.println("uid = " + uid);

        //返回登录用户
        return Result.ok("查询订单、需要token校验");
    }

    /**
     * 测试不需要token
     * @return
     */
    @PostMapping("/test")
    private Result test2() {
        return Result.ok("主页的商品展示、不需要token...");
    }


    //用户申请绑卡业务
    /**
     *  1、前端发送 请求数据过来  (不用写前端、数据的传递 依赖 开发接口文档实现 )
     *
     *  2、绑卡的业务
     *   1、获取token中登录用户
         2、判断当前用户是否已经绑定银行卡
         *        Assert.error(userDetail.getCardBindStatus(), BusinessCode.USER_ALREADY_BINDED);
         *        查询userDetail 表中的  CARD_BIND_STATUS 字段状态  (未绑卡是0)
         3、判断提交过来的银行卡是否已被绑定
         *        （绑卡业务请求的时候、会把银行的id传递过来）
         *          通过银行卡id 查询 UserCard (是否有存在的数据)  存在、已绑卡
         4、更新用户的信息、更新用户明细、保存银行卡信息（user_card表）、
                  绑卡的 在  UserCard  表中(添加 UserCard 的数据)
     *
     */
    @PostMapping("/auth/bank/card/add")
    public Result addBankAccount(@RequestBody CardAddDto cardAddDto){


        userService.addBankAccount(cardAddDto);

        return Result.ok("绑卡成功");
    }

    @PostMapping("/find/{userId}")
    public UserInfoVo findUserById(@PathVariable("userId") String userId){

        //查询用户信息 拿到  真实姓名
        User user = userService.getById(userId);
        //查询 详情   拿到usercode 和身份id
        UserDetail  userDetail = userDetailService.getById(userId);

        //返回数据
        UserInfoVo  userInfoVo = new UserInfoVo();
        userInfoVo.setUserCode(userDetail.getUserCode());
        userInfoVo.setRealName(user.getRealName());
        userInfoVo.setIdentityCode(user.getIdentityCode());

        return userInfoVo;
    }

}
